package com.imut.lagain.repository;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.imut.lagain.entity.UserRole;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 用户角色Repository接口
 */
@Mapper
public interface UserRoleRepository extends BaseMapper<UserRole> {
    
    /**
     * 根据用户ID查询角色
     * @param userId 用户ID
     * @return 用户角色
     */
    @Select("SELECT * FROM user_role WHERE user_id = #{userId} AND is_deleted = 0")
    UserRole findByUserId(@Param("userId") Long userId);
    
    /**
     * 根据角色类型查询用户列表
     * @param roleType 角色类型
     * @return 用户角色列表
     */
    @Select("SELECT * FROM user_role WHERE role_type = #{roleType} AND is_deleted = 0 AND is_active = 1")
    List<UserRole> findByRoleType(@Param("roleType") String roleType);
    
    /**
     * 检查用户是否有指定角色
     * @param userId 用户ID
     * @param roleType 角色类型
     * @return 是否存在
     */
    @Select("SELECT COUNT(*) > 0 FROM user_role WHERE user_id = #{userId} AND role_type = #{roleType} AND is_deleted = 0 AND is_active = 1")
    boolean existsByUserIdAndRoleType(@Param("userId") Long userId, @Param("roleType") String roleType);
    
    /**
     * 更新用户角色状态
     * @param userId 用户ID
     * @param isActive 是否激活
     * @return 影响行数
     */
    @Update("UPDATE user_role SET is_active = #{isActive}, update_time = NOW() WHERE user_id = #{userId} AND is_deleted = 0")
    int updateActiveStatus(@Param("userId") Long userId, @Param("isActive") Boolean isActive);
    
    /**
     * 更新管理员密码
     * @param userId 用户ID
     * @param adminPassword 加密后的密码
     * @return 影响行数
     */
    @Update("UPDATE user_role SET admin_password = #{adminPassword}, update_time = NOW() WHERE user_id = #{userId} AND role_type = 'ADMIN' AND is_deleted = 0")
    int updateAdminPassword(@Param("userId") Long userId, @Param("adminPassword") String adminPassword);
    
    /**
     * 查询所有管理员
     * @return 管理员角色列表
     */
    @Select("SELECT * FROM user_role WHERE role_type = 'ADMIN' AND is_deleted = 0 AND is_active = 1")
    List<UserRole> findAllAdmins();
    
    /**
     * 查询所有伴侣
     * @return 伴侣角色列表
     */
    @Select("SELECT * FROM user_role WHERE role_type = 'PARTNER' AND is_deleted = 0 AND is_active = 1")
    List<UserRole> findAllPartners();
    
    /**
     * 根据用户ID删除角色（软删除）
     * @param userId 用户ID
     * @return 影响行数
     */
    @Update("UPDATE user_role SET is_deleted = 1, update_time = NOW() WHERE user_id = #{userId}")
    int deleteByUserId(@Param("userId") Long userId);
}
